package com.sdtv.basemodule.rx;

import android.annotation.SuppressLint;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.LogUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sdtv.basemodule.bean.SqlEntityBean;
import com.sdtv.basemodule.cache.DaoUtils;
import com.sdtv.basemodule.config.AppConfig;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;

/**
 * @ProjectName: MediunFusion
 * @Package: com.sdtv.basemodule.rx
 * @ClassName: BaseSignalObserver
 * @Description: 该类实现了SingleObserver
 * --这里主要是处理从数据库获取的缓存数据
 * @Author: 小郭同学
 * @CreateDate: 2019-07-16 09:42
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
public class BaseSignalObserver<T> implements SingleObserver<SqlEntityBean> {

    private Class<T> clazz;

    public BaseSignalObserver(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public void onSubscribe(Disposable d) {

    }

    /**
     * 获取到缓存数据 进行解析
     *
     * @param sqlEntityBean
     */
    @SuppressLint("CheckResult")
    @Override
    public void onSuccess(SqlEntityBean sqlEntityBean) {
        //获取缓存数据成功--
        if (null != sqlEntityBean) {
            //判断缓存数据是否过期了
            if (System.currentTimeMillis() - sqlEntityBean.getTime() < DaoUtils.cacheTime) {
                //数据已经过期了 ---不在使用了
                LogUtils.e("缓存时间已经过期，不在使用该数据,将该条数据从数据库中删除");
                DaoUtils.deleteDataByKey(sqlEntityBean);
                onNext("");
                onNext(new ArrayList<>());
                return;
            }
            String value = sqlEntityBean.getValue();
//            LogUtils.eTag(" <<-执行到获取value>>" + value);
            try {
                JsonElement jsonElement = new JsonParser().parse(value);
                if (jsonElement instanceof JsonObject) {
                    JSONObject jsonObject = JSONObject.parseObject(value);
                    // 把jsonObject解析成对象返回
                    onNext(jsonObject.toJavaObject(clazz));
                    return;
                } else if (jsonElement instanceof JsonArray) {
                    List<T> dataList = JSONArray.parseArray(value, clazz);
                    onNext(dataList);
                    return;
                }
                LogUtils.eTag(" <<--不是一个合法的JSON串->>");
            } catch (Exception e) {
                LogUtils.eTag(" --不是一个合法的JSON串-");
            }
            // 既不是jsonObject 也不是 jsonArry- 则在这里返回 让前台自己处理
            onNext(value);
        } else {
            //-- 缓存数据过期 或者 没有缓存
            onNext(new ArrayList<>());
            onNext("");
        }


    }

    @Override
    public void onError(Throwable e) {
        // 获取缓存数据失败了  --
        AppConfig.INSTANCE.getRxErrorHandler()
                .getErrorHandlerFactory().handleError(e);
    }

    /**
     * 返回缓存的对象
     *
     * @param data
     */
    public void onNext(T data) {

    }

    /**
     * 返回缓存的列表数据 --
     *
     * @param dataList
     */
    public void onNext(List<T> dataList) {

    }

    /**
     * 不是一个合法的Json数据 这里交个前端自己处理
     *
     * @param value
     */
    public void onNext(String value) {

    }


}
